home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC Graphics Unleashed
/
PC Graphics Unleashed.iso
/
ch18
/
rtrace
/
3ds2scn.awk
< prev
next >
Wrap
Text File
|
1994-01-02
|
7KB
|
343 lines
BEGIN {
pi = 4.0 * atan2(1, 1)
CONVFMT = "%.10g"
OFMT = "%.10g"
tol = 0.00005
verbose = 2
}
function abs(a) {
return (a > 0 ? a : -a)
}
/^Ambient[ \t]+[Ll]ight[ \t]+[Cc]olor/ {
r = substr($4, 5)
g = substr($5, 7)
b = substr($6, 6)
print "ambient", r, g, b
next
}
/^Background[ \t]+[Ss]olid[ \t]+[Cc]olor/ {
r = substr($4, 5)
g = substr($5, 7)
b = substr($6, 6)
print "background", r, g, b
bg = 1
next
}
/^Named[ \t]+[Oo]bject/ {
if (ft != 0 && f != ft) {
print "Error: too few triangles" >"/dev/stderr"
ft = 0
exit
}
if (ft != 0) {
for (i = 0; i < ft; i++) {
i1 = v1[i]
if (y[i1] == "R") i1 = x[i1]
i2 = v2[i]
if (y[i2] == "R") i2 = x[i2]
i3 = v3[i]
if (y[i3] == "R") i3 = x[i3]
if (i1 == i2 || i1 == i3 || i2 == i3) {
fdg++
continue
}
s = m[i]
if (i in fs) {
if (abs(nx[i1]) < tol && abs(ny[i1]) < tol && abs(nz[i1]) < tol) {
fdg++
continue
}
if (abs(nx[i2]) < tol && abs(ny[i2]) < tol && abs(nz[i2]) < tol) {
fdg++
continue
}
if (abs(nx[i3]) < tol && abs(ny[i3]) < tol && abs(nz[i3]) < tol) {
fdg++
continue
}
print "triangle normal", s, \
x[i1], y[i1], z[i1], nx[i1], ny[i1], nz[i1], \
x[i2], y[i2], z[i2], nx[i2], ny[i2], nz[i2], \
x[i3], y[i3], z[i3], nx[i3], ny[i3], nz[i3]
} else
print "triangle", s, x[i1], y[i1], z[i1], \
x[i2], y[i2], z[i2], x[i3], y[i3], z[i3]
}
for (i in x) delete x[i]
for (i in y) delete y[i]
for (i in z) delete z[i]
for (i in nx) delete nx[i]
for (i in ny) delete ny[i]
for (i in nz) delete nz[i]
for (i in v1) delete v1[i]
for (i in v2) delete v2[i]
for (i in v3) delete v3[i]
for (i in fs) delete fs[i]
for (i in m) delete m[i]
}
oname = $3
for (i = 4; i <= NF; i++) oname = oname""$i
otype = 0
ft = 0
print ";", oname
if (verbose) printf "\n%s", oname >"/dev/stderr"
next
}
/^Tri-mesh/ {
if (otype != 0) {
print "Error: bad object" >"/dev/stderr"
exit
}
otype = 1
v = 0
f = 0
vt = $3
fast = 0
if (vt > 500) fast = 1
ft = $5
if (verbose) print ":", vt, ft >"/dev/stderr"
if (verbose > 1) {
vcnt = int(vt / 65) + 1
fcnt = int(ft / 65) + 1
}
next
}
/^Vertex[ \t]+[Ll]ist/ {
if (verbose > 1) {
printf "vertices: " >"/dev/stderr"
cnt = 0
}
next
}
/^Vertex[ \t]+[0-9]+/ {
if (otype != 1) {
print "Error: bad vertex" >"/dev/stderr"
exit
}
if (verbose > 1) {
cnt++
if (cnt % vcnt == 0) printf "." >"/dev/stderr"
}
if (!fast) {
for (vr = 0; vr < v; vr++) {
if (abs(x[vr] - $4) < tol && \
abs(y[vr] - $6) < tol && \
abs(z[vr] - $8) < tol) break
}
if (vr != v) {
vdg++
x[v] = vr
y[v] = "R"
z[v] = ""
v++
if (v > vt) {
print "Error: too many vertices" >"/dev/stderr"
exit
}
next
}
}
x[v] = $4
y[v] = $6
z[v] = $8
v++
if (v > vt) {
print "Error: too many vertices" >"/dev/stderr"
exit
}
next
}
/^Face[ \t]+[Ll]ist/ {
if (v != vt) {
print "Error: too few vertices" >"/dev/stderr"
exit
}
if (verbose > 1) {
printf "\n faces: " >"/dev/stderr"
cnt = 0
}
next
}
/^Face[ \t]+[0-9]+/ {
if (verbose > 1) {
cnt++
if (cnt % fcnt == 0) printf "." >"/dev/stderr"
}
v1[f] = $4
v2[f] = $6
v3[f] = $8
f++
if (f > ft) {
print "Error: too many triangles" >"/dev/stderr"
ft = 0
exit
}
next
}
/^Material/ {
if (NF <= 1) s = "DEFAULT"
if (NF > 1) s = $2
for (i = 3; i <= NF; i++) s = s""$i
if (!(s in mlist)) {
mlist[s] = ""
print "#define", s, "surface matte white data"
}
m[f - 1] = s
next
}
/^Smoothing/ {
fs[f - 1] = ""
i1 = v1[f - 1]
if (y[i1] == "R") i1 = x[i1]
p1x = x[i1]
p1y = y[i1]
p1z = z[i1]
i2 = v2[f - 1]
if (y[i2] == "R") i2 = x[i2]
p2x = x[i2] - p1x
p2y = y[i2] - p1y
p2z = z[i2] - p1z
i3 = v3[f - 1]
if (y[i3] == "R") i3 = x[i3]
p3x = x[i3] - p1x
p3y = y[i3] - p1y
p3z = z[i3] - p1z
p1x = p2y * p3z - p2z * p3y
p1y = p2z * p3x - p2x * p3z
p1z = p2x * p3y - p2y * p3x
t = sqrt(p1x * p1x + p1y * p1y + p1z * p1z)
if (t < tol) {
f--
ft--
next
}
p1x /= t
p1y /= t
p1z /= t
if (!(i1 in nx)) {
nx[i1] = 0
ny[i1] = 0
nz[i1] = 0
}
nx[i1] += p1x
ny[i1] += p1y
nz[i1] += p1z
if (!(i2 in nx)) {
nx[i2] = 0
ny[i2] = 0
nz[i2] = 0
}
nx[i2] += p1x
ny[i2] += p1y
nz[i2] += p1z
if (!(i3 in nx)) {
nx[i3] = 0
ny[i3] = 0
nz[i3] = 0
}
nx[i3] += p1x
ny[i3] += p1y
nz[i3] += p1z
next
}
/^Direct[ \t]+[Ll]ight/ {
getline
px = $3
py = $5
pz = $7
ltype = 1
getline
while ($1 != "Light") {
if ($1 == "Spotlight") {
ltype = 2
sx = $4 - px
sy = $6 - py
sz = $8 - pz
}
if ($1 == "Falloff") {
f = $3
}
getline
}
r = substr($3, 5)
g = substr($4, 7)
b = substr($5, 6)
if (ltype == 1) print "light point", px, py, pz, r, g, b
if (ltype == 2) print "light spot", px, py, pz, sx, sy, sz, \
r, g, b, f / 2, 2
next
}
/^Camera/ {
if (NF > 1) {
i = 1
fd = ""
t = substr($2, 2, 1)
while (t != "m") {
fd = fd""t
t = substr($2, 2 + i, 1)
i++
}
printf "fov %.6g ;%.10g mm\n", atan2(46.0, fd) * 90 / pi, fd
}
getline
px = $3
py = $5
pz = $7
print "eye", px, py, pz
getline
px = $3
py = $5
pz = $7
print "look", px, py, pz
getline
print "up 0 0 1"
next
}
END {
if (ft != 0 && f != ft) {
print "Error: too few triangles" >"/dev/stderr"
exit
}
if (ft != 0) {
for (i = 0; i < ft; i++) {
i1 = v1[i]
if (y[i1] == "R") i1 = x[i1]
i2 = v2[i]
if (y[i2] == "R") i2 = x[i2]
i3 = v3[i]
if (y[i3] == "R") i3 = x[i3]
if (i1 == i2 || i1 == i3 || i2 == i3) {
fdg++
continue
}
s = m[i]
if (i in fs) {
if (abs(nx[i1]) < tol && abs(ny[i1]) < tol && abs(nz[i1]) < tol) {
fdg++
continue
}
if (abs(nx[i2]) < tol && abs(ny[i2]) < tol && abs(nz[i2]) < tol) {
fdg++
continue
}
if (abs(nx[i3]) < tol && abs(ny[i3]) < tol && abs(nz[i3]) < tol) {
fdg++
continue
}
print "triangle normal", s, \
x[i1], y[i1], z[i1], nx[i1], ny[i1], nz[i1], \
x[i2], y[i2], z[i2], nx[i2], ny[i2], nz[i2], \
x[i3], y[i3], z[i3], nx[i3], ny[i3], nz[i3]
} else
print "triangle", s, x[i1], y[i1], z[i1], \
x[i2], y[i2], z[i2], x[i3], y[i3], z[i3]
}
}
if (!bg) print "background black"
if (verbose > 1) print "" >"/dev/stderr"
if (vdg > 0) \
print "Warning: bad vertices -", vdg >"/dev/stderr"
if (fdg > 0) \
print "Warning: bad triangles -", fdg >"/dev/stderr"
}